package shiro.encryption;

import org.apache.shiro.crypto.hash.Md5Hash;
import org.apache.shiro.crypto.hash.SimpleHash;
import org.junit.jupiter.api.Test;

/**
 * 加密密码
 */
public class Encryption {

    /**
     * 传统的MD5加密，Md5加密虽然是不可逆的，虽然无法直接通过计算反推回密码，
     * 但是我们仍然可以通过计算一些简单的密码加密后的 Md5 值进行比较，推算出原来的密码。
     */
    @Test
    public void testMd5() {
        String password = "123456";
        String encodePassword = new Md5Hash(password).toString();

        System.out.println(encodePassword);
    }

    /**
     * 既然相同的密码 md5 一样，那么我们就让我们的原始密码再加一个随机数，然后再进行 md5 加密，
     * 这个随机数就是我们说的盐(salt)，这样处理下来就能得到不同的 Md5 值，当
     * 然我们需要把这个随机数盐也保存进数据库中，以便我们进行验证。
     */
    @Test
    public void testShiro() {
        String password = "123456";
//        String salt = new SecureRandomNumberGenerator().nextBytes().toString();
        String salt = "cOoJVEcSSJ/zN5qUC9qMaA==";
        int times = 2; // 加密次数
        String alogrithmName = "md5"; // 加密算法

        String encodePassword = new SimpleHash(alogrithmName, password, salt, times).toString();
//        6f90c81723190fc121e94fcdd481badb
        System.out.printf("原始密码是 %s , 盐是： %s, 运算次数是： %d, 运算出来的密文是：%s ", password, salt, times, encodePassword);

    }


}
